import axios from "axios";
// 配置服务器地址
const baseURL = process.env.VUE_APP_API_BASE_URL;
// 创建一个 axios 实例
const instance = axios.create({
  baseURL: baseURL,
});
/**
 * 请求拦截器会在发送请求之前执行，而响应拦截器会在收到响应之后但在将数据返回给 .then 或 .catch 处理程序之前执行。
 *
 * 请求拦截器执行顺序：
 * 1、请求拦截器在请求发送之前执行，用于修改请求配置。
 * 2、发送请求到服务器。
 * 3、响应拦截器在接收到服务器响应后、但在数据返回给 .then 或 .catch 之前执行，用于修改响应数据或处理错误。
 **/
// Add a request interceptor 添加一个请求拦截器
instance.interceptors.request.use(
  function (config) {
    // Do something before request is sent在发送请求之前做些什么
    const token = localStorage.getItem("token");
    config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  function (error) {
    // Do something with request error做一些请求错误
    return Promise.reject(error);
  }
);

// Add a response interceptor 添加一个响应拦截器
instance.interceptors.response.use(
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data

    // 登录成功，将token值存储起来
    const { authorization } = response.headers;
    authorization && localStorage.setItem("token", authorization);
    return response;
  },
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error

    // 处理 token 失效等错误
    // 对响应错误做点什么
    if (error.response) {
      // 服务器响应了一个状态码，且状态码触发了错误
      const status = error.response.status;
      const message = error.response.data.message || "An error occurred";

      // 根据状态码执行不同的操作，例如显示消息框
      if (status === 401) {
        // 未授权，重定向到登录页面
        localStorage.removeItem("token");
        window.location.href = "#/login";
      } else if (status === 403) {
        // 禁止访问
        console.error("Forbidden:", message);
        // ...处理逻辑
      } else if (status >= 400 && status < 500) {
        // 客户端错误
        console.error("客户端错误:", message);
      } else if (status >= 500) {
        // 服务器错误
        console.error("服务器错误:", message);
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error("No response:", error.request);
    } else {
      // 发生在设置请求时的错误
      console.error("Error:", error.message);
    }
    // 返回一个Promise.reject()来阻止请求继续
    return Promise.reject(error);
  }
);

// 覆盖默认的 axios 实例
axios.defaults = instance.defaults;
axios.interceptors = instance.interceptors;

export default axios;
